/*
 * 版权声明 (c) 2025 XXX科技有限公司
 *
 * 本软件及其相关文档文件受版权保护。未经版权所有者明确书面许可，任何单位或个人不得
 * 以任何形式复制、传播、修改、出售、出租、反向工程、反编译或利用本软件的任何部分。
 *
 * 对于任何违反本声明的行为，版权所有者保留追究法律责任的权利。
 */

#ifndef __MESSAGE_H__
#define __MESSAGE_H__
#include "utils/address.h"

using namespace std;

namespace biz {
	uint16_t CRC16(const char *ptr, int len);

	typedef uint8_t Magic;

	enum Msg_Type : uint8_t {
		SGW_SUMMON    = 0x00, // 网关召唤
		SGW_SYNCHRO   = 0x01, // 服务同步
		SGW_HEARTBEAT = 0x02, // 网关心跳
		SGW_REQUEST   = 0x03, // 服务请求
		API_PING      = 0x10, // Ping
		API_GATEWAYS  = 0x11, // Gateways
		API_SERVICES  = 0x12, // Services
		API_AGENTS    = 0x13, // Agents
		API_SESSIONS  = 0x14, // Sessions
	};

// 严格1字节对齐
#pragma pack(push, 1)
	struct Message {
		Magic    magic;        // 魔数标识(快速识别协议等)
		uint8_t  flag;         // 标志位(加密|压缩|可靠传输|分片|优先级等)
		Address  routers[4];   // 路有记录（客户端，Cli代理，xxx,目标服务）
		uint16_t payload_len;  // 载荷长度
		char    *payload_data; // 负载数据
	};
#pragma pack(pop)

	size_t message_size(const Message &msg);

	void serialize(const Message *msg, char *buffer, const size_t len);

	void deserialize(Message *msg, const char *buffer, size_t len);

	void free_message(Message *msg);
} // namespace biz
#endif // __MESSAGE_H__
